package base

import (
	"bufio"
	"bytes"
	"fmt"
	"strings"
)

func UseBufIO() {
	// 创建一个 NewReader
	s := strings.NewReader("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
	br := bufio.NewReader(s)
	r := make([]byte, 20)

	fmt.Printf("创建一个 NewReader 查看数据 len=%d\n", s.Len())

	// 查看 NewReader 数据, 不取出
	b, _ := br.Peek(5)
	fmt.Printf("查看 NewReader 数据, 不取出1 %s\n", b)
	// ABCDE

	b[0] = 'a'
	b, _ = br.Peek(5)
	fmt.Printf("查看 NewReader 数据, 不取出2 %s\n", b)
	// aBCDE

	// 使用 ReadByte 查看, 每次查看一个byte
	c,_ := br.ReadByte()
	fmt.Printf("使用 ReadByte 查看, %c\n", c)
	// 使用 ReadBytes 查看
	c,_ = br.ReadByte()
	fmt.Printf("使用 ReadBytes 查看, %c\n", c)

	// 每次查看20个
	n, err := br.Read(r)
	fmt.Printf("使用Read 查看1, 每次查看20个 %-20s %-2v %v\n", r[:n], n, err)
	// 使用Read 查看 aBCDEFGHIJKLMNOPQRST 20 <nil>

	n, err = br.Read(r)
	fmt.Printf("使用Read 查看2, 每次查看20个 %-20s %-2v %v\n", r[:n], n, err)

	n, err = br.Read(r)
	fmt.Printf("使用Read 查看3, 每次查看20个 %-20s %-2v %v\n", r[:n], n, err)

	// 重新赋值共后边使用
	br.Reset(s)
	fmt.Printf("重置 Reader len=%d\n", s.Len())

	// 重新赋值
	bs := bytes.NewBuffer(make([]byte, 0))
	bw := bufio.NewWriter(bs)
	bw.WriteString("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
	fmt.Println("重新赋值 Available=", bw.Available()) // 4096
	fmt.Println("重新赋值 Buffered=", bw.Buffered())  // 0

	bw.WriteString("ABCDEFGH")
	fmt.Println("重新赋值 Available=", bw.Available()) // 4088
	fmt.Println("重新赋值 Buffered=", bw.Buffered())  // 8
	fmt.Printf("重新赋值 bs=%q\n", bs)       // ""

	bw.Flush()
	fmt.Println("重新赋值 Available=", bw.Available())
	fmt.Println("重新赋值 Buffered=", bw.Buffered())
	fmt.Printf("重新赋值 bs=%q\n", bs)      // "ABCEFG"

	// Reader 和 Writer 函数
	brw := bufio.NewReadWriter(br, bw)
	brw.WriteString("hh")
	brw.Flush()
	fmt.Println("Reader 和 Writer 函数, Writer", bs)

	d,_ := brw.ReadString('\n')
	fmt.Println("Reader 和 Writer 函数, Reader", d)

	// Scanner 扫描置顶格式数据
	ss := strings.NewReader("ABC nDEF nGHI nJKL")
	ssr := bufio.NewScanner(ss)
	// 以单词分割
	ssr.Split(bufio.ScanWords)
	for ssr.Scan() {
		fmt.Printf("Scanner 扫描置顶格式数据 %s %v\n", ssr.Bytes(), ssr.Text())
	}

}